<?php

class Func {

    // 엔코드
    function encode($data) {
        return base64_encode($data) . "||";
    }

    function check_bytes($num) {
        $btail = "bytes";
        $ktail = "K";
        if ($num >= 1024 && $num < 1048576) {
            $this_num = $num / 1024;
            $namuji = $num % 1024;
        } else if ($num >= 1024 && $num >= 1048576) {
            $this_num = $num / 1048576;
            $namuji = $num % 1048576;
            if ($namuji >= 1024) {
                $namuji = $namuji / 1024;
                $btail = "K";
            }
            $ktail = "M";
        } else
            $this_num = $num;
        echo $this->Nformat($this_num, 0) . "&nbsp;" . $ktail . "&nbsp;&nbsp;";
        if ($namuji > 0)
            echo $this->Nformat($namuji, 0) . " " . $btail;
    }

    function Nformat($value, $sort) {
        echo number_format($value, $sort);
        return;
    }

    // 디코드
    function decode($data) {
        $vars = explode("&", base64_decode(str_replace("||", "", $data)));
        $vars_num = count($vars);
        for ($i = 0; $i < $vars_num; $i++) {
            $elements = explode("=", $vars[$i]);
            $var[$elements[0]] = $elements[1];
        }
        return $var;
    }

    // 문자열 자르기
    function cutStringByUtf8($string, $length, $checkmb = false, $tail = '') {
        preg_match_all('/[\xEA-\xED][\x80-\xFF]{2}|./', $string, $match);
        $m = $match[0];
        $slen = strlen($string);  // length of source string
        $tlen = strlen($tail); // length of tail string
        $mlen = count($m);    // length of matched characters

        if ($slen <= $length)
            return $string;
        if (!$checkmb && $mlen <= $length)
            return $string;

        $ret = array();
        $count = 0;

        for ($i = 0; $i < $length; $i++) {
            $count += ( $checkmb && strlen($m[$i]) > 1) ? 2 : 1;
            if ($count + $tlen > $length)
                break;
            $ret[] = $m[$i];
        }
        return join('', $ret) . $tail;
    }

    // HTML 출력
    function stringToHtml($string) {
        $string = trim($string);
        $string = stripslashes($string);
        return $string;
    }

    // 문자열 HTML BR 형태 출력
    function stringToHtmlBr($string) {
        $string = trim($string);
        $string = stripslashes($string);
        $string = str_replace("\n", "<br>", $string);
        return $string;
    }

    // 문자열 TEXT 형태 출력
    function stringToHtmlNo($string) {
        $string = trim($string);
        $string = htmlspecialchars($string);
        $string = stripslashes($string);
        $string = str_replace("\n", "<br>", $string);
        return $string;
    }

    // 문자열 TEXT 형태 출력
    function stringToHtmlNoBr($string) {
        $string = trim($string);
        $string = htmlspecialchars($string);
        $string = stripslashes($string);
        return $string;
    }

    // 날자출력 형태
    function getDateFormat($string, $check = 1) {
        if ($check == 1) {
            $year = substr($string, 0, 4);
            $mon = substr($string, 5, 2);
            $day = substr($string, 8, 2);
            $string = $year . "/" . $mon . "/" . $day;
        } else if ($check == 2) {
            $year = substr($string, 0, 4);
            $mon = substr($string, 5, 2);
            $day = substr($string, 8, 2);
            $time = substr($string, 11, 2);
            $minu = substr($string, 14, 2);
            $sec = substr($string, 17, 2);
            $string = $year . "/" . $mon . "/" . $day . " " . $time . ":" . $minu . ":" . $sec;
        } else if ($check == 3) {
            $year = substr($string, 0, 4);
            $mon = substr($string, 5, 2);
            $day = substr($string, 8, 2);
            $string = $year . "-" . $mon . "-" . $day;
        } else if ($check == 4) {
            $year = substr($string, 0, 4);
            $mon = substr($string, 5, 2);
            $day = substr($string, 8, 2);
            $time = substr($string, 11, 2);
            $minu = substr($string, 14, 2);
            $string = $year . "-" . $mon . "-" . $day . " " . $time . ":" . $minu;
        } else if ($check == 5) {
            $year = substr($string, 0, 4);
            $mon = substr($string, 5, 2);
            $day = substr($string, 8, 2);
            $string = $year . "년 " . $mon . "월 " . $day . "일";
        } else if ($check == 6) {
            $year = substr($string, 0, 4);
            $mon = substr($string, 5, 2);
            $day = substr($string, 8, 2);
            $time = substr($string, 11, 2);
            $minu = substr($string, 14, 2);
            $string = $year . "년 " . $mon . "월 " . $day . "일 " . $time . "시 " . $minu . "분";
        } else if ($check == 7) {
            $year = substr($string, 0, 4);
            $mon = substr($string, 5, 2);
            $day = substr($string, 8, 2);
            $time = substr($string, 11, 2);
            $minu = substr($string, 14, 2);
            $string = $year . "-" . $mon . "-" . $day;
        }
        return $string;
    }

    // 숫자로 된 값을 요일로 변환한다. (0:월요일, 1:화요일, 6:일요일)
    function getDayOfWeek($check) {
        if ($check == 0) {
            $string = "월요일";
        } else if ($check == 1) {
            $string = "화요일";
        } else if ($check == 2) {
            $string = "수요일";
        } else if ($check == 3) {
            $string = "목요일";
        } else if ($check == 4) {
            $string = "금요일";
        } else if ($check == 5) {
            $string = "토요일";
        } else if ($check == 6) {
            $string = "일요일";
        }
        return $string;
    }

    # E-MAIL 주소가 정확한 것인지 검사하는 함수
    #
    # eregi - 정규 표현식을 이용한 검사 (대소문자 무시)
    #         http://www.php.net/manual/function.eregi.php
    # gethostbynamel - 호스트 이름으로 ip 를 얻어옴
    #          http://www.php.net/manual/function.gethostbynamel.php
    # checkdnsrr - 인터넷 호스트 네임이나 IP 어드레스에 대응되는 DNS 레코드를 체크함
    #          http://www.php.net/manual/function.checkdnsrr.php

    function checkMail($email, $hostCheck = 0) {
        $url = trim($email);
        if ($hostCheck) {
            $host = explode("@", $url);
            if (eregi("^[\xA1-\xFEa-z0-9_-]+@[\xA1-\xFEa-z0-9_-]+\.[a-z0-9._-]+$", $url)) {
                if (checkdnsrr($host[1], "MX") || gethostbynamel($host[1]))
                    return $url;
                else
                    return false;
            }
        } else {
            if (eregi("^[\xA1-\xFEa-z0-9_-]+@[\xA1-\xFEa-z0-9_-]+\.[a-z0-9._-]+$", $url))
                return $url;
            else
                return false;
        }
    }

    // 주민등록번호진위여부 확인 함수
    function checkJumin($resno1, $resno2) {
        $resno = $resno1 . $resno2;
        $length = strlen($resno);
        if ($length <> 13)
            return false;
        if (!ereg('^[[:digit:]]{6}[1-4][[:digit:]]{6}$', $resno))
            return false;
        $birthYear = ('2' >= $resno[6]) ? '19' : '20';
        $birthYear += substr($resno, 0, 2);
        $birthMonth = substr($resno, 2, 2);
        $birthDate = substr($resno, 4, 2);
        if (!checkdate($birthMonth, $birthDate, $birthYear))
            return false;
        for ($i = 0; $i < 13; $i++)
            $buf[$i] = (int) $resno[$i];
        $multipliers = array(2, 3, 4, 5, 6, 7, 8, 9, 2, 3, 4, 5);
        for ($i = $sum = 0; $i < 12; $i++)
            $sum += ( $buf[$i] *= $multipliers[$i]);
        if ((11 - ($sum % 11)) % 10 != $buf[12])
            return false;
        return true;
    }

    // 사업자등록번호 체크 함수
    function checkCompany($reginum) {
        $weight = '137137135';
        $length = strlen($reginum);
        $sum = 0;
        if ($length <> 10)
            return false;
        for ($i = 0; $i < 9; $i++)
            $sum = $sum + (substr($reginum, $i, 1) * substr($weight, $i, 1));
        $sum = $sum + ((substr($reginum, 8, 1) * 5) / 10);
        $rst = $sum % 10;
        if ($rst == 0)
            $result = 0;
        else
            $result = 10 - $rst;
        $saub = substr($reginum, 9, 1);
        if ($result <> $saub)
            return false;
        return true;
    }

    # 문자열에 한글이 포함되어 있는지 검사하는 함수

    function checkHangeul($string) {
        # 특정 문자가 한글의 범위내(0xA1A1 - 0xFEFE)에 있는지 검사
        $stringCnt = 0;
        while (strlen($string) >= $stringCnt) {
            $char = ord($string[$stringCnt]);
            if ($char >= 0xa1 && $char <= 0xfe)
                return true;
            $stringCnt++;
        }
    }

    // 파일 확장자 구하는 함수
    function getExtensionFile($file) {
        $ex = explode(".", $file);
        $extension = $ex[count($ex) - 1];

        return $extension;
    }

    // 올리면 안되는 파일들 검사
    function checkFileTail($file) {
        $array = array("html", "php", "js", "htm", "inc", "jsp", "asp");

        for ($i = 0; $i < count($array); $i++) {
            if (!strcasecmp($array[$i], $file)) {
                error_msg("해당 파일은 업로드가 금지되어 있습니다.");
            }
        }
    }

    // 난수 구하기
    function getRandomNum($start, $end) {
        srand((double) microtime() * 1000000);
        $tmp = rand($start, $end);

        return $tmp;
    }

    // 그림 파일인지 확인
    function checkImageFile($file) {
        $extension = $this->getExtensionFile($file);

        $array = array("jpg", "jpeg", "gif", "png", "bmp");

        $check = 0;
        for ($i = 0; $i < count($array); $i++) {
            if (!strcasecmp($array[$i], $extension)) {
                //echo"<script  language='JavaScript' charset='utf-8'>alert('$extension');</script>";
                $check++;
            }
        }

        return $check;
    }

    function checkFlashFile($file) {
        $extension = $this->getExtensionFile($file);

        $array = array("swf");

        $check = 0;
        for ($i = 0; $i < count($array); $i++) {
            if (!strcasecmp($array[$i], $extension)) {
                $check++;
            }
        }

        return $check;
    }

    // 파일 업로드 함수
    function uploadFile($dir, $file, $o_file, $small_size = "") {


        $extension = $this->getExtensionFile($o_file);
        $this->checkFileTail($extension);
        $rand_time = $this->getRandomNum(1, 1000000) . "_" . time();
        $save = $dir . "/o_file/" . $rand_time . "." . $extension;
        $save2 = $dir . "/s_file/s_" . $rand_time . "." . $extension;
        if (!move_uploaded_file($file, $save)) {
            //error_msg($_FILES['userfile']['name'].$_FILES['userfile']['type'].$_FILES['userfile']['error'].$_FILES['userfile']['size'].$_FILES['userfile']['tmp_name']);
            //error_msg($o_file);
            echo("파일업로드에 실패하였습니다.");
        }

        // 만약 확장자가 그림파일이면 썸네일을 만듭니다..
        if ($this->checkImageFile($o_file) > 0) {
            if (!$small_size)
                $small_size = 300;
            $this->resizeImage($small_size, $save2, $save, $reheight = "");
        }

        return $rand_time . "." . $extension;
    }

    // 썸네일 함수
    function resizeImage($rewidth, $smallfile, $picture, $reheight = "") {
        $picsize = getimagesize($picture);

        // reheight 길이가 주어지지 않으면 비율에 맞게 맞춘다.
        if (!$reheight) {
            // x : y = x2 : y2 ==> yx2 = xy2 ==> yx2/x = y2
            @$reheight = ceil(($picsize[1] * $rewidth) / $picsize[0]);
        }

        if ($picsize[2] === 1) {
            @header("Content-Type: imgage/gif");
            $dstimg = imagecreatetruecolor($rewidth, $reheight);
            $srcimg = @ImageCreateFromGIF($picture);
            ImageCopyResampled($dstimg, $srcimg, 0, 0, 0, 0, $rewidth, $reheight, ImageSX($srcimg), ImageSY($srcimg));
            Imagegif($dstimg, $smallfile, 50);
        } else if ($picsize[2] === 2) {
            @header("Content-Type: images/jpeg");
            $dstimg = imagecreatetruecolor($rewidth, $reheight);
            $srcimg = ImageCreateFromJPEG($picture);
            ImageCopyResampled($dstimg, $srcimg, 0, 0, 0, 0, $rewidth, $reheight, ImageSX($srcimg), ImageSY($srcimg));
            Imagejpeg($dstimg, $smallfile, 50);
        } elseif ($picsize[2] === 3) {
            @header("Content-Type: images/png");
            $dstimg = imagecreatetruecolor($rewidth, $reheight);
            $srcimg = ImageCreateFromPNG($picture);
            ImageCopyResampled($dstimg, $srcimg, 0, 0, 0, 0, $rewidth, $reheight, ImageSX($srcimg), ImageSY($srcimg));
            Imagepng($dstimg, $smallfile, 5); //전에는 1~100사이의 값을 넣엇는데 php5에서는 1~10사이의 값을 넣는다
        }
        // 다른 형식의 애러 문제로 인한 @ 추가
        @ImageDestroy($dstimg);
        @ImageDestroy($srcimg);
    }

    // 파일 다운로드 함수 경로, 원파일명, 다운 0/보임 1, 다운속도, 속도제한여부
    function fDown($file, $name, $downview, $speed, $limit) {
        if (!file_exists($file)) {
            echo("파일이 존재하지 않습니다.");
        }
        $size = filesize($file);
        $name = rawurldecode($name);

        if (ereg('Opera(/| )([0-9].[0-9]{1,2})', $_SERVER['HTTP_USER_AGENT'])) {
            $UserBrowser = "Opera";
        } else if (ereg('MSIE ([0-9].[0-9]{1,2})', $_SERVER['HTTP_USER_AGENT'])) {
            $UserBrowser = "IE";
        } else {
            $UserBrowser = '';
        }

        $downview = ($downview) ? "attachment" : "inline";

        $mime_type = ($UserBrowser == 'IE' || $UserBrowser == 'Opera' ) ? 'application/octetstream' : 'application/octet-stream';
        @ob_end_clean(); /// decrease cpu usage extreme
        Header('Content-Type: ' . $mime_type);
        Header('Content-Disposition: ' . $downview . '; filename="' . $name . '"');
        Header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
        Header('Accept-Ranges: bytes');
        Header("Cache-control: private");
        Header('Pragma: private');

        if (isset($_SERVER['HTTP_RANGE'])) {
            list($a, $range) = explode("=", $_SERVER['HTTP_RANGE']);
            str_replace($range, "-", $range);
            $size2 = $size - 1;
            $new_length = $size - $range;
            Header("HTTP/1.1 206 Partial Content");
            Header("Content-Length: $new_length");
            Header("Content-Range: bytes $range$size2/$size");
        } else {
            $size2 = $size - 1;
            Header("Content-Length: " . $size);
        }
        $chunksize = 1 * (1024 * $speed);

        if ($file = fopen($file, 'rb')) {
            if (isset($_SERVER['HTTP_RANGE']))
                fseek($file, $range);
            while (!feof($file) and ( connection_status() == 0)) {
                $buffer = fread($file, $chunksize);
                print($buffer); //echo($buffer); // is also possible
                flush();
                if ($limit)
                    sleep(1); // 다운로드 속도제한
            }
            fclose($file);
        }else {
            die('Error can not open file!!');
        }
        if (isset($new_length)) {
            $size = $new_length;
        }
        die();
        Header("Connection: close");
    }

    // 문자열 체크(숫자)
    function checkDigit($string) {
        if (ereg("^[1-9]+[0-9]*$", $string))
            return true;
        else
            return false;
    }

    // 문자열 체크(알파)
    function checkAlpha($string) {
        if (ereg("^[a-zA-Z]+[a-zA-Z]*$", $string))
            return true;
        else
            return false;
    }

    // 문자열 체크(알파+숫자)
    function checkAlphaNum($string) {
        if (ereg("^[1-9a-zA-Z]+[0-9a-zA-Z]*$", $string))
            return true;
        else
            return false;
    }

    // 문자열 체크(알파+숫자+특수문자)
    function checkAlphaNumAll($string) {
        if (ereg("^[1-9a-zA-Z_-]+[0-9a-zA-Z_-]*$", $string))
            return true;
        else
            return false;
    }

    // 메세지 출력
    function showMessage($message) {
        echo "<script language='javascript'> alert('$message'); </script>";
    }

    // 메세지 출력후 BACK
    function showErrMessage($message) {
        echo "<script language='javascript'> alert('$message'); history.back(); </script>";
        exit();
    }

    // 메세지 출력후 이동하는 자바스크립트
    function showAlertScriptGo($message, $url) {
        echo "<script language='javascript'> alert('$message'); location.replace('$url'); </script>";
        exit();
    }

    // alert
    function alert($message) {
        echo "<script language='javascript'> alert('$message'); </script>";
        exit();
    }

    //alwertReload
    function alertReload($message) {
        echo "<script language='javascript'> alert('$message'); location.reload();</script>";
        exit();
    }

    // 메세지 출력후 이동하는 메타테그
    function showAlertMetaGo($message, $url) {
        echo "<script language='javascript'> alert('$message'); </script>";
        echo "<meta http-equiv='refresh' content='0;url=$url'>";
        exit();
    }

    // 메타태그로 바로 가기
    function metaGo($url) {
        echo "<meta http-equiv='refresh' content='0;url=$url'>";
        exit();
    }

    // 자바스크립트로 바로 가기
    function scriptGo($url) {
        echo "<script language='javascript'> location.href='$url'; </script>";
        exit();
    }

    // 창을 닫기
    function windowClose() {
        echo "<script language='javascript'> window.close(); </script>";
        exit();
    }

    // 메세지 출력후 창을 닫기
    function showMessageClose($message) {
        echo "<script language='javascript'> alert('$message'); window.close(); </script>";
        exit();
    }

    // 창을 닫고 가는 함수
    function scriptGoClose($url) {
        echo "<script language='javascript'> opener.location.replace('$url'); self.close(); </script>";
        exit();
    }

    // 프레임으로 된 경우 상위 프레임으로 가는 함수
    function scriptGoTop($url) {
        echo "<script language='javascript'> parent.frames.top.location.replace('$url'); </script>";
        exit();
    }

    //영어랑 숫자가 섞인 난수발생기
    function randCode($nc, $a = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789') {
        $l = strlen($a) - 1;
        $r = '';
        while ($nc-- > 0)
            $r .= $a{mt_rand(0, $l)};
        return $r;
    }

    //글쓰기 할때 토큰 발생
    function makeToken($session_name = "rand_num") {
        //자주쓰는 함수들

        $_A = new Aes(AES_PASS);
        $_SESSION[$session_name] = $this->getRandomNum(1, 1000000) . "_" . time();
        $key_tmp = $_SESSION[$session_name] . "@@@" . $_SERVER['REMOTE_ADDR'];
        $key_crypt = sha1($_A->encrypt($key_tmp));
        return $key_crypt;
    }

    //글쓰기 넘어온값 토큰 비교
    function compareToken($token, $session_name = "rand_num") {
        $_A = new Aes(AES_PASS);
        $key_tmp = $_SESSION[$session_name] . "@@@" . $_SERVER['REMOTE_ADDR'];
        $key_crypt = sha1($_A->encrypt($key_tmp));
//        echo "token: $key_crypt";
        $_SESSION[$session_name] = "";
        if ($token == $key_crypt) {
            return true;
        } else {
            return false;
        }
    }

    function encrypt($str) {
        $a = new Aes(AES_PASS);
        $e = base64_encode($a->encrypt($str));
        return $e;
    }

    function decrypt($str) {
        $a = new Aes(AES_PASS);
        $d = $a->decrypt(base64_decode($str));
        return $d;
    }

    function makeHash($str) {
        $h = sha1($str);
        return $h;
    }

    function makeActivationKey($user_id, $user_pass, $user_nick) {

        $tmp1 = md5($user_id . $user_pass . $user_nick . rand());
        $tmp2 = sha1($user_id . $user_pass . $user_nick . rand());
        $tmp3 = $tmp1 . $tmp2;
        return $tmp3;
    }

    //4.x버전 구버전 mysql
    function makeMysqlPassword4($pass) {

        $nr = 1345345333;
        $add = 7;
        $nr2 = 0x12345671;

        $size = strlen($pass);
        for ($i = 0; $i < $size; $i++) {
            if ($pass[$i] == ' ' || $pass[$i] == '\t')
                continue;
            $tmp = ord($pass[$i]);
            $nr ^= ((($nr & 63) + $add) * $tmp) + ($nr << 8);
            $nr2 += ($nr2 << 8) ^ $nr;
            $add += $tmp;
        }
        $result1 = $nr & ((1 << 31) - 1);
        $result2 = $nr2 & ((1 << 31) - 1);
        $result = sprintf("%08x%08x", $result1, $result2);
        return $result;
    }

    //5.x버전이상 mysql
    function makeMysqlPassword5($password) {
        $nr = 1345345333;
        $add = 7;
        $nr2 = 0x12345671;

        settype($password, "string");

        for ($i = 0; $i < strlen($password); $i++) {
            if ($password[$i] == ' ' || $password[$i] == '\t')
                continue;
            $tmp = ord($password[$i]);
            $nr ^= ((($nr & 63) + $add) * $tmp) + ($nr << 8);
            $nr2 += ($nr2 << 8) ^ $nr;
            $add += $tmp;
        }
        $result1 = sprintf("%08lx", $nr & ((1 << 31) - 1));
        $result2 = sprintf("%08lx", $nr2 & ((1 << 31) - 1));

        if ($result1 == '80000000')
            $nr += 0x80000000;
        if ($result2 == '80000000')
            $nr2 += 0x80000000;

        return sprintf("%08lx%08lx", $nr, $nr2);
    }

}
